package marina;

import java.util.ArrayList;

public class J19Generic {
	public static void main(String[] args){
		
		//고정 크기 배열
		Tiger zoo1[] = new Tiger[3];
		//호랑이를 가두기 위한 동물원
		Lion zoo2[] = new Lion[3];
		//사자를 가두기 위한 동물원
		Zebra zoo3[] = new Zebra[3];
		//얼룩말을 가두기 위한 동물원
		Animal zoo4[] = new Animal[3];
		//호랑이, 사자, 얼룩말을 가둘 수 있는 동물원
		Object zoo5[] = new Object[3];
		//호랑이, 사자, 얼룩말을 아니라 언급되지 않은 다른 동물들도 가둘 수 있는 동물원
		//(Object클래스는 모든 클래스의 조상.)
		zoo1[1] = new Tiger();
		//zoo1[1] = new Zebra();	//오류!
		//zoo1은 Tiger만 담을 수 있음.
		//zoo4[1] = new Monkey();	//오류!
		//Monkey는 Animal과 상속관계가 아님.
		zoo5[1] = new Monkey();
		Animal animal1 = zoo4[1];
		//Lion lion1 = zoo4[1];		//오류!
		//Animal(부모) 객체를 Lion(자식) 객체에 저장하려면 먼저 downcasting 해야함.
		Lion lion1 = (Lion)zoo4[1];
		//따라서, downcasting 시 명시적으로 변환하려는 자료형을 기술하는 것은 다소 귀찮을 수 있다.(중요!)
		
		//컬렉션(가변 크기 배열)
		//컬렉션에서는 어떤 종류의 자료를 담을지 모르기 때문에 최상위 조상 객체인 Object형태로 저장 및 관리하도록 설계되어 있음.
		ArrayList zoo6 = new ArrayList();	//JDK4-
		zoo6.add(new Tiger());
		zoo6.add(new Lion());
		zoo6.add(new Zebra());
		zoo6.add(new Monkey());
		zoo6.add(new Whale());
		//제네릭을 사용하지 않았더니 잡다한 것들이 다 들어감...
		
		//제네릭을 이용하면 프로그래머가 컬렉션에 사용할 객체의 유형을 명확하게 지정해서 이 유형과 다른 객체는 저장되지 못하게 함.
		//따라서, 컴파일 시 오류 확인이 빨라짐.
		ArrayList<Tiger> zoo7 = new ArrayList<Tiger>();	//JDK5+
		zoo7.add(new Tiger());
		//zoo7.add(new Zebra());	//오류!
		//zoo7에는 제네릭으로 Tiger만 객체 저장할 수 있도록 한정시킴. 따라서 예상치 못한 오류가 발생할 수 있는 가능성은 낮아짐.
		ArrayList<Lion> zoo8 = new ArrayList<>(); //JDK7+
	}//main
}//class

class Animal {
	
}
class Tiger extends Animal {
	
}
class Lion extends Animal {
	
}
class Zebra extends Animal {
	
}
class Monkey {
	
}
class Whale {
	
}